Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / components / call / RingtoneEditorModal.vue

Displaying Raw • Download


meshchatx/src/frontend/components/call/RingtoneEditorModal.vue 7d7cd7d48701e74ab38cef0db1eca1b0cd23cf87 (7d7cd7d4) Text, 22.07 KB

Tb4b4b4<Tff7b72templateTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"fixed inset-0 z-[100] flex items-center justify-center p-4 sm:p-6"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"absolute inset-0 bg-zinc-900/80 backdrop-blur-sm" Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3$emitTb4b4b4(Ta5d6ff'close'Tb4b4b4)Ta5d6ff"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"relative w-full max-w-4xl bg-white dark:bg-zinc-900 rounded-3xl shadow-2xl overflow-hidden flex flex-col max-h-[90vh]"
Tb4b4b4>
T8b949e<!-- Header -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"px-6 py-4 border-b border-gray-100 dark:border-zinc-800 flex items-center justify-between"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72h3 Te6edf3classTff7b72=Ta5d6ff"text-lg font-bold text-gray-900 dark:text-white"Tb4b4b4>Edit RingtoneTb4b4b4<Tb4b4b4/Tff7b72h3Tb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-500 dark:text-zinc-500"Tb4b4b4>Tff7b72{{ Te6edf3ringtoneTb4b4b4.Te6edf3display_name Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3classTff7b72=Ta5d6ff"p-2 hover:bg-gray-100 dark:hover:bg-zinc-800 rounded-full transition-colors"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3$emitTb4b4b4(Ta5d6ff'close'Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"size-6 text-gray-500" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Content -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1 overflow-y-auto p-6 space-y-6"Tb4b4b4>
T8b949e<!-- Waveform Container -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"relative bg-gray-50 dark:bg-zinc-800/50 rounded-2xl p-4 border border-gray-100 dark:border-zinc-800 min-h-[200px] flex flex-col justify-center"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3loadingTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex flex-col items-center justify-center space-y-3"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"size-8 border-4 border-blue-500/20 border-t-blue-500 rounded-full animate-spin"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-500 dark:text-zinc-400 font-medium"Tb4b4b4>Loading audio...Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

Tb4b4b4<Tff7b72div Te6edf3v-showTff7b72=Ta5d6ff"Tff7b72!Te6edf3loadingTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"relative"Tb4b4b4>
Tb4b4b4<Tff7b72canvas
Te6edf3refTff7b72=Ta5d6ff"waveform"
Te6edf3classTff7b72=Ta5d6ff"w-full h-40 cursor-pointer"
Tb4b4b4@Te6edf3mousedownTff7b72=Ta5d6ff"Te6edf3handleWaveformClickTa5d6ff"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72canvasTb4b4b4>

T8b949e<!-- Playback Progress -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"absolute top-0 bottom-0 w-0.5 bg-blue-500 z-10 pointer-events-none"
Tb4b4b4:Te6edf3styleTff7b72=Ta5d6ff"Tb4b4b4{ Te6edf3leftTff7b72: Te6edf3progressPercent Tff7b72+ Ta5d6ff'%' Tb4b4b4}Ta5d6ff"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Selection Overlays -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"absolute top-0 bottom-0 bg-blue-500/10 border-x-2 border-blue-500 z-20"
Tb4b4b4:Te6edf3styleTff7b72=Ta5d6ff"Tb4b4b4{ Te6edf3leftTff7b72: Te6edf3startPercent Tff7b72+ Ta5d6ff'%'Tb4b4b4, Te6edf3widthTff7b72: Te6edf3endPercent Tff7b72- Te6edf3startPercent Tff7b72+ Ta5d6ff'%' Tb4b4b4}Ta5d6ff"
Tb4b4b4>
T8b949e<!-- Handles -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"absolute top-1/2 -left-3 -translate-y-1/2 size-6 bg-white dark:bg-zinc-700 border-2 border-blue-500 rounded-full shadow-lg cursor-ew-resize flex items-center justify-center group"
Tb4b4b4@Te6edf3mousedownTb4b4b4.Te6edf3stopTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3startDraggingTb4b4b4(Ta5d6ff'start'Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"w-0.5 h-3 bg-blue-500 group-hover:h-4 transition-all"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"absolute top-1/2 -right-3 -translate-y-1/2 size-6 bg-white dark:bg-zinc-700 border-2 border-blue-500 rounded-full shadow-lg cursor-ew-resize flex items-center justify-center group"
Tb4b4b4@Te6edf3mousedownTb4b4b4.Te6edf3stopTb4b4b4.Te6edf3preventTff7b72=Ta5d6ff"Te6edf3startDraggingTb4b4b4(Ta5d6ff'end'Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"w-0.5 h-3 bg-blue-500 group-hover:h-4 transition-all"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Controls -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 md:grid-cols-2 gap-6"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-between"Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold text-gray-700 dark:text-zinc-300"Tb4b4b4>Time RangeTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-mono text-gray-500"
Tb4b4b4>Tff7b72{{ Te6edf3formatTimeTb4b4b4(Te6edf3startTimeTb4b4b4) Tff7b72}} - Tff7b72{{ Te6edf3formatTimeTb4b4b4(Te6edf3endTimeTb4b4b4) Tff7b72}} (Tff7b72{{
Te6edf3formatTimeTb4b4b4(Te6edf3endTime Tff7b72- Te6edf3startTimeTb4b4b4)
Tff7b72}})Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"block text-[10px] uppercase font-bold text-gray-400 mb-1"Tb4b4b4>StartTb4b4b4<Tb4b4b4/Tff7b72labelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTb4b4b4.Te6edf3numberTff7b72=Ta5d6ff"Te6edf3startTimeTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3stepTff7b72=Ta5d6ff"0.01"
Te6edf3minTff7b72=Ta5d6ff"0"
Tb4b4b4:Te6edf3maxTff7b72=Ta5d6ff"Te6edf3endTimeTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"w-full bg-gray-50 dark:bg-zinc-800 border-none rounded-lg text-sm px-3 py-2 focus:ring-2 focus:ring-blue-500 text-gray-900 dark:text-white"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"block text-[10px] uppercase font-bold text-gray-400 mb-1"Tb4b4b4>EndTb4b4b4<Tb4b4b4/Tff7b72labelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTb4b4b4.Te6edf3numberTff7b72=Ta5d6ff"Te6edf3endTimeTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3stepTff7b72=Ta5d6ff"0.01"
Tb4b4b4:Te6edf3minTff7b72=Ta5d6ff"Te6edf3startTimeTa5d6ff"
Tb4b4b4:Te6edf3maxTff7b72=Ta5d6ff"Te6edf3totalDurationTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"w-full bg-gray-50 dark:bg-zinc-800 border-none rounded-lg text-sm px-3 py-2 focus:ring-2 focus:ring-blue-500 text-gray-900 dark:text-white"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-col justify-end"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-center gap-2 py-3 rounded-xl font-bold transition-all w-full"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"
Te6edf3isPlaying
Tff7b72? Ta5d6ff'bg-orange-500 text-white shadow-lg shadow-orange-500/20'
Tff7b72: Ta5d6ff'bg-blue-600 text-white shadow-lg shadow-blue-500/20'
Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3togglePlayTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Tb4b4b4:Te6edf3icon-nameTff7b72=Ta5d6ff"Te6edf3isPlaying Tff7b72? Ta5d6ff'pause' Tff7b72: Ta5d6ff'play'Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tff7b72{{ Te6edf3isPlaying Tff7b72? Ta5d6ff"Pause Selection" Tff7b72: Ta5d6ff"Play Selection" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Footer -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"px-6 py-4 bg-gray-50 dark:bg-zinc-800/30 border-t border-gray-100 dark:border-zinc-800 flex items-center justify-between"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3idTff7b72=Ta5d6ff"saveAsNew"
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3saveAsNewTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"checkbox"
Te6edf3classTff7b72=Ta5d6ff"rounded border-gray-300 text-blue-600 focus:ring-blue-500"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3forTff7b72=Ta5d6ff"saveAsNew" Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-600 dark:text-zinc-400 cursor-pointer"
Tb4b4b4>Save as new ringtoneTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-3"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3classTff7b72=Ta5d6ff"px-4 py-2 text-sm font-bold text-gray-500 hover:text-gray-700 dark:hover:text-zinc-300 transition-colors"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3$emitTb4b4b4(Ta5d6ff'close'Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Cancel
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Tb4b4b4:Te6edf3disabledTff7b72=Ta5d6ff"Te6edf3saving Tff7b72|| Te6edf3loadingTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"px-6 py-2 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 rounded-xl text-sm font-bold shadow-lg transition-all hover:scale-[1.02] active:scale-[0.98] disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3saveTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3savingTa5d6ff" Te6edf3icon-nameTff7b72=Ta5d6ff"loading" Te6edf3classTff7b72=Ta5d6ff"size-4 animate-spin" Tb4b4b4/Tb4b4b4>
Tff7b72{{ Te6edf3saving Tff7b72? Ta5d6ff"Saving..." Tff7b72: Ta5d6ff"Save Audio" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>

Tb4b4b4<Tff7b72scriptTb4b4b4>
Tff7b72import Te6edf3MaterialDesignIcon Tff7b72from Ta5d6ff"../MaterialDesignIcon.vue"Tb4b4b4;
Tff7b72import Te6edf3ToastUtils Tff7b72from Ta5d6ff"../../js/ToastUtils"Tb4b4b4;

Tff7b72export Tff7b72default Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"RingtoneEditorModal"Tb4b4b4,
Te6edf3componentsTff7b72: Tb4b4b4{
Te6edf3MaterialDesignIconTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3propsTff7b72: Tb4b4b4{
Te6edf3ringtoneTff7b72: Tb4b4b4{
Te6edf3typeTff7b72: Tffa657ObjectTb4b4b4,
Te6edf3requiredTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3emitsTff7b72: Tb4b4b4[Ta5d6ff"close"Tb4b4b4, Ta5d6ff"saved"Tb4b4b4]Tb4b4b4,
Te6edf3dataTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3loadingTff7b72: Tff7b72trueTb4b4b4,
Te6edf3savingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3audioBufferTff7b72: Tff7b72nullTb4b4b4,
Te6edf3audioContextTff7b72: Tff7b72nullTb4b4b4,
Te6edf3sourceNodeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3startTimeTff7b72: T79c0ff0Tb4b4b4,
Te6edf3endTimeTff7b72: T79c0ff0Tb4b4b4,
Te6edf3totalDurationTff7b72: T79c0ff0Tb4b4b4,
Te6edf3isPlayingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3playbackStartTimeTff7b72: T79c0ff0Tb4b4b4,
Te6edf3playbackStartOffsetTff7b72: T79c0ff0Tb4b4b4,
Te6edf3progressPercentTff7b72: T79c0ff0Tb4b4b4,
Te6edf3animationFrameTff7b72: Tff7b72nullTb4b4b4,
Te6edf3draggingTff7b72: Tff7b72nullTb4b4b4,
Te6edf3saveAsNewTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3computedTff7b72: Tb4b4b4{
Te6edf3startPercentTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3startTime Tff7b72/ Tff7b72thisTb4b4b4.Te6edf3totalDurationTb4b4b4) Tff7b72* T79c0ff100 Tff7b72|| T79c0ff0Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3endPercentTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3endTime Tff7b72/ Tff7b72thisTb4b4b4.Te6edf3totalDurationTb4b4b4) Tff7b72* T79c0ff100 Tff7b72|| T79c0ff100Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3mountedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3loadAudioTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"mousemove"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3handleDraggingTb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"mouseup"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3stopDraggingTb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"resize"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3drawWaveformTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3beforeUnmountTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3stopPlaybackTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3removeEventListenerTb4b4b4(Ta5d6ff"mousemove"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3handleDraggingTb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3removeEventListenerTb4b4b4(Ta5d6ff"mouseup"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3stopDraggingTb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3removeEventListenerTb4b4b4(Ta5d6ff"resize"Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3drawWaveformTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3audioContextTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3audioContextTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3methodsTff7b72: Tb4b4b4{
Tff7b72async Te6edf3loadAudioTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3loading Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Te6edf3fetchTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/telephone/ringtones/Tffd700${Tff7b72thisTb4b4b4.Te6edf3ringtoneTb4b4b4.Te6edf3idTffd700}Ta5d6ff/audioTa5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3arrayBuffer Tff7b72= Tff7b72await Te6edf3responseTb4b4b4.Te6edf3arrayBufferTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3audioContext Tff7b72= Tff7b72new Tb4b4b4(Tffa657windowTb4b4b4.Te6edf3AudioContext Tff7b72|| Tffa657windowTb4b4b4.Te6edf3webkitAudioContextTb4b4b4)Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3audioBuffer Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3audioContextTb4b4b4.Te6edf3decodeAudioDataTb4b4b4(Te6edf3arrayBufferTb4b4b4)Tb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3totalDuration Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4.Te6edf3durationTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3startTime Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3endTime Tff7b72= Tff7b72thisTb4b4b4.Te6edf3totalDurationTb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3drawWaveformTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to load audio:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"call.failed_load_audio_edit"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$emitTb4b4b4(Ta5d6ff"close"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3loading Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3drawWaveformTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3canvas Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4.Te6edf3waveformTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3canvas Tff7b72|| Tff7b72!Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4) Tff7b72returnTb4b4b4;

Tff7b72const Te6edf3ctx Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3getContextTb4b4b4(Ta5d6ff"2d"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3width Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3clientWidthTb4b4b4;
Tff7b72const Te6edf3height Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3clientHeightTb4b4b4;

T8b949e// Set canvas internal resolution
Te6edf3canvasTb4b4b4.Te6edf3width Tff7b72= Te6edf3width Tff7b72* Tffa657windowTb4b4b4.Te6edf3devicePixelRatioTb4b4b4;
Te6edf3canvasTb4b4b4.Te6edf3height Tff7b72= Te6edf3height Tff7b72* Tffa657windowTb4b4b4.Te6edf3devicePixelRatioTb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3scaleTb4b4b4(Tffa657windowTb4b4b4.Te6edf3devicePixelRatioTb4b4b4, Tffa657windowTb4b4b4.Te6edf3devicePixelRatioTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3data Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4.Te6edf3getChannelDataTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3step Tff7b72= Tffa657MathTb4b4b4.Te6edf3ceilTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3length Tff7b72/ Te6edf3widthTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3amp Tff7b72= Te6edf3height Tff7b72/ T79c0ff2Tb4b4b4;

Te6edf3ctxTb4b4b4.Te6edf3clearRectTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3widthTb4b4b4, Te6edf3heightTb4b4b4)Tb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3beginPathTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3moveToTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3ampTb4b4b4)Tb4b4b4;

T8b949e// Draw a nice modern waveform
Te6edf3ctxTb4b4b4.Te6edf3strokeStyle Tff7b72= Tff7b72thisTb4b4b4.Te6edf3isDarkModeTb4b4b4(Tb4b4b4) Tff7b72? Ta5d6ff"#3f3f46" Tff7b72: Ta5d6ff"#e4e4e7"Tb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3lineWidth Tff7b72= T79c0ff1Tb4b4b4;

Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3widthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3min Tff7b72= T79c0ff1.0Tb4b4b4;
Tff7b72let Te6edf3max Tff7b72= Tff7b72-T79c0ff1.0Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3stepTb4b4b4; Te6edf3jTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3datum Tff7b72= Te6edf3dataTb4b4b4[Te6edf3i Tff7b72* Te6edf3step Tff7b72+ Te6edf3jTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3datum Tff7b72< Te6edf3minTb4b4b4) Te6edf3min Tff7b72= Te6edf3datumTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3datum Tff7b72> Te6edf3maxTb4b4b4) Te6edf3max Tff7b72= Te6edf3datumTb4b4b4;
Tb4b4b4}
Te6edf3ctxTb4b4b4.Te6edf3moveToTb4b4b4(Te6edf3iTb4b4b4, Te6edf3amp Tff7b72+ Te6edf3min Tff7b72* Te6edf3ampTb4b4b4)Tb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3lineToTb4b4b4(Te6edf3iTb4b4b4, Te6edf3amp Tff7b72+ Te6edf3max Tff7b72* Te6edf3ampTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3ctxTb4b4b4.Te6edf3strokeTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// Highlight the selected range
Tff7b72const Te6edf3startX Tff7b72= Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3startTime Tff7b72/ Tff7b72thisTb4b4b4.Te6edf3totalDurationTb4b4b4) Tff7b72* Te6edf3widthTb4b4b4;
Tff7b72const Te6edf3endX Tff7b72= Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3endTime Tff7b72/ Tff7b72thisTb4b4b4.Te6edf3totalDurationTb4b4b4) Tff7b72* Te6edf3widthTb4b4b4;

Te6edf3ctxTb4b4b4.Te6edf3beginPathTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3strokeStyle Tff7b72= Ta5d6ff"#3b82f6"Tb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3lineWidth Tff7b72= T79c0ff1.5Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3startXTb4b4b4)Tb4b4b4; Te6edf3i Tff7b72< Tffa657MathTb4b4b4.Te6edf3ceilTb4b4b4(Te6edf3endXTb4b4b4)Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3min Tff7b72= T79c0ff1.0Tb4b4b4;
Tff7b72let Te6edf3max Tff7b72= Tff7b72-T79c0ff1.0Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3stepTb4b4b4; Te6edf3jTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3datum Tff7b72= Te6edf3dataTb4b4b4[Te6edf3i Tff7b72* Te6edf3step Tff7b72+ Te6edf3jTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3datum Tff7b72< Te6edf3minTb4b4b4) Te6edf3min Tff7b72= Te6edf3datumTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3datum Tff7b72> Te6edf3maxTb4b4b4) Te6edf3max Tff7b72= Te6edf3datumTb4b4b4;
Tb4b4b4}
Te6edf3ctxTb4b4b4.Te6edf3moveToTb4b4b4(Te6edf3iTb4b4b4, Te6edf3amp Tff7b72+ Te6edf3min Tff7b72* Te6edf3ampTb4b4b4)Tb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3lineToTb4b4b4(Te6edf3iTb4b4b4, Te6edf3amp Tff7b72+ Te6edf3max Tff7b72* Te6edf3ampTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3ctxTb4b4b4.Te6edf3strokeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3isDarkModeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657documentTb4b4b4.Te6edf3documentElementTb4b4b4.Te6edf3classListTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"dark"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3formatTimeTb4b4b4(Te6edf3secondsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3mins Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3seconds Tff7b72/ T79c0ff60Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3secs Tff7b72= Tb4b4b4(Te6edf3seconds Tff7b72% T79c0ff60Tb4b4b4)Tb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72return Ta5d6ff`Tffd700${Te6edf3minsTffd700}Ta5d6ff:Tffd700${Te6edf3secsTb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff5Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3startDraggingTb4b4b4(Te6edf3typeTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3dragging Tff7b72= Te6edf3typeTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3stopDraggingTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3dragging Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3drawWaveformTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3handleDraggingTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3draggingTb4b4b4) Tff7b72returnTb4b4b4;

Tff7b72const Te6edf3canvas Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4.Te6edf3waveformTb4b4b4;
Tff7b72const Te6edf3rect Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3getBoundingClientRectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3x Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3minTb4b4b4(Te6edf3eTb4b4b4.Te6edf3clientX Tff7b72- Te6edf3rectTb4b4b4.Te6edf3leftTb4b4b4, Te6edf3rectTb4b4b4.Te6edf3widthTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3time Tff7b72= Tb4b4b4(Te6edf3x Tff7b72/ Te6edf3rectTb4b4b4.Te6edf3widthTb4b4b4) Tff7b72* Tff7b72thisTb4b4b4.Te6edf3totalDurationTb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3dragging Tff7b72=== Ta5d6ff"start"Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3startTime Tff7b72= Tffa657MathTb4b4b4.Te6edf3minTb4b4b4(Te6edf3timeTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3endTime Tff7b72- T79c0ff0.1Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3dragging Tff7b72=== Ta5d6ff"end"Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3endTime Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(Te6edf3timeTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3startTime Tff7b72+ T79c0ff0.1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3handleWaveformClickTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3canvas Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4.Te6edf3waveformTb4b4b4;
Tff7b72const Te6edf3rect Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3getBoundingClientRectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3x Tff7b72= Te6edf3eTb4b4b4.Te6edf3clientX Tff7b72- Te6edf3rectTb4b4b4.Te6edf3leftTb4b4b4;
Tff7b72const Te6edf3time Tff7b72= Tb4b4b4(Te6edf3x Tff7b72/ Te6edf3rectTb4b4b4.Te6edf3widthTb4b4b4) Tff7b72* Tff7b72thisTb4b4b4.Te6edf3totalDurationTb4b4b4;

T8b949e// If click is outside selection, move nearest boundary
Tff7b72if Tb4b4b4(Te6edf3time Tff7b72< Tff7b72thisTb4b4b4.Te6edf3startTimeTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3startTime Tff7b72= Te6edf3timeTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3time Tff7b72> Tff7b72thisTb4b4b4.Te6edf3endTimeTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3endTime Tff7b72= Te6edf3timeTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// If click is inside, maybe we can use it to seek preview
T8b949e// but for now let's just keep it simple
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3drawWaveformTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3togglePlayTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3isPlayingTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3stopPlaybackTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3startPlaybackTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3startPlaybackTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4) Tff7b72returnTb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3stopPlaybackTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3sourceNode Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioContextTb4b4b4.Te6edf3createBufferSourceTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sourceNodeTb4b4b4.Te6edf3buffer Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sourceNodeTb4b4b4.Te6edf3connectTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3audioContextTb4b4b4.Te6edf3destinationTb4b4b4)Tb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3playbackStartOffset Tff7b72= Tff7b72thisTb4b4b4.Te6edf3startTimeTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3playbackStartTime Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioContextTb4b4b4.Te6edf3currentTimeTb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3sourceNodeTb4b4b4.Te6edf3startTb4b4b4(T79c0ff0Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3startTimeTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3endTime Tff7b72- Tff7b72thisTb4b4b4.Te6edf3startTimeTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isPlaying Tff7b72= Tff7b72trueTb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3sourceNodeTb4b4b4.Te6edf3onended Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isPlaying Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3progressPercent Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3cancelAnimationFrameTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3animationFrameTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3updateProgressTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3stopPlaybackTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3sourceNodeTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3sourceNodeTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sourceNode Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isPlaying Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3progressPercent Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3cancelAnimationFrameTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3animationFrameTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3updateProgressTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isPlayingTb4b4b4) Tff7b72returnTb4b4b4;

Tff7b72const Te6edf3elapsed Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioContextTb4b4b4.Te6edf3currentTime Tff7b72- Tff7b72thisTb4b4b4.Te6edf3playbackStartTimeTb4b4b4;
Tff7b72const Te6edf3currentTime Tff7b72= Tff7b72thisTb4b4b4.Te6edf3playbackStartOffset Tff7b72+ Te6edf3elapsedTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3progressPercent Tff7b72= Tb4b4b4(Te6edf3currentTime Tff7b72/ Tff7b72thisTb4b4b4.Te6edf3totalDurationTb4b4b4) Tff7b72* T79c0ff100Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3currentTime Tff7b72>= Tff7b72thisTb4b4b4.Te6edf3endTimeTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3stopPlaybackTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tff7b72thisTb4b4b4.Te6edf3animationFrame Tff7b72= Te6edf3requestAnimationFrameTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3updateProgressTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3saveTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3saving Tff7b72= Tff7b72trueTb4b4b4;

T8b949e// Create a trimmed version of the audio
Tff7b72const Te6edf3sampleRate Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4.Te6edf3sampleRateTb4b4b4;
Tff7b72const Te6edf3startSample Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3startTime Tff7b72* Te6edf3sampleRateTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3endSample Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3endTime Tff7b72* Te6edf3sampleRateTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3frameCount Tff7b72= Te6edf3endSample Tff7b72- Te6edf3startSampleTb4b4b4;

Tff7b72const Te6edf3offlineCtx Tff7b72= Tff7b72new Te6edf3OfflineAudioContextTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4.Te6edf3numberOfChannelsTb4b4b4, Te6edf3frameCountTb4b4b4, Te6edf3sampleRateTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3trimmedBuffer Tff7b72= Te6edf3offlineCtxTb4b4b4.Te6edf3createBufferTb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4.Te6edf3numberOfChannelsTb4b4b4,
Te6edf3frameCountTb4b4b4,
Te6edf3sampleRate
Tb4b4b4)Tb4b4b4;

Tff7b72for Tb4b4b4(Tff7b72let Te6edf3channel Tff7b72= T79c0ff0Tb4b4b4; Te6edf3channel Tff7b72< Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4.Te6edf3numberOfChannelsTb4b4b4; Te6edf3channelTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3data Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioBufferTb4b4b4.Te6edf3getChannelDataTb4b4b4(Te6edf3channelTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3trimmedData Tff7b72= Te6edf3trimmedBufferTb4b4b4.Te6edf3getChannelDataTb4b4b4(Te6edf3channelTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3frameCountTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3trimmedDataTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3dataTb4b4b4[Te6edf3startSample Tff7b72+ Te6edf3iTb4b4b4]Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// Convert AudioBuffer to WAV blob
Tff7b72const Te6edf3blob Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioBufferToWavTb4b4b4(Te6edf3trimmedBufferTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3formData Tff7b72= Tff7b72new Te6edf3FormDataTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3filename Tff7b72= Tff7b72thisTb4b4b4.Te6edf3saveAsNew Tff7b72? Ta5d6ff`Ta5d6ffedited_Tffd700${Tff7b72thisTb4b4b4.Te6edf3ringtoneTb4b4b4.Te6edf3filenameTffd700}Ta5d6ff` Tff7b72: Tff7b72thisTb4b4b4.Te6edf3ringtoneTb4b4b4.Te6edf3filenameTb4b4b4;

Te6edf3formDataTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"file"Tb4b4b4, Te6edf3blobTb4b4b4, Te6edf3filenameTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3saveAsNewTb4b4b4) Tb4b4b4{
Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff"/api/v1/telephone/ringtones/upload"Tb4b4b4, Te6edf3formDataTb4b4b4, Tb4b4b4{
Te6edf3headersTff7b72: Tb4b4b4{ Ta5d6ff"Content-Type"Tff7b72: Ta5d6ff"multipart/form-data" Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// We don't have a direct "replace" endpoint, but we can delete and upload,
T8b949e// or just upload as a new one.
T8b949e// For now let's just upload as a new one if it's simpler,
T8b949e// but the user might expect replacement.
T8b949e// The backend doesn't seem to support direct replacement via the upload endpoint.
T8b949e// Let's just upload it.
Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff"/api/v1/telephone/ringtones/upload"Tb4b4b4, Te6edf3formDataTb4b4b4, Tb4b4b4{
Te6edf3headersTff7b72: Tb4b4b4{ Ta5d6ff"Content-Type"Tff7b72: Ta5d6ff"multipart/form-data" Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;

T8b949e// If not saving as new, maybe delete the old one?
T8b949e// await window.axios.delete(`/api/v1/telephone/ringtones/${this.ringtone.id}`);
Tb4b4b4}

Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"call.ringtone_saved"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$emitTb4b4b4(Ta5d6ff"saved"Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$emitTb4b4b4(Ta5d6ff"close"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to save ringtone:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"call.failed_save_ringtone"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3saving Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3audioBufferToWavTb4b4b4(Te6edf3bufferTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3numOfChan Tff7b72= Te6edf3bufferTb4b4b4.Te6edf3numberOfChannelsTb4b4b4;
Tff7b72const Te6edf3length Tff7b72= Te6edf3bufferTb4b4b4.Te6edf3length Tff7b72* Te6edf3numOfChan Tff7b72* T79c0ff2 Tff7b72+ T79c0ff44Tb4b4b4;
Tff7b72const Te6edf3buffer_arr Tff7b72= Tff7b72new Tffa657ArrayBufferTb4b4b4(Te6edf3lengthTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3view Tff7b72= Tff7b72new Tffa657DataViewTb4b4b4(Te6edf3buffer_arrTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3channels Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72let Te6edf3iTb4b4b4;
Tff7b72let Te6edf3sampleTb4b4b4;
Tff7b72let Te6edf3offset Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72let Te6edf3pos Tff7b72= T79c0ff0Tb4b4b4;

Tff7b72const Te6edf3setUint16 Tff7b72= Tb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3viewTb4b4b4.Te6edf3setUint16Tb4b4b4(Te6edf3posTb4b4b4, Te6edf3dataTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3pos Tff7b72+= T79c0ff2Tb4b4b4;
Tb4b4b4}Tb4b4b4;

Tff7b72const Te6edf3setUint32 Tff7b72= Tb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3viewTb4b4b4.Te6edf3setUint32Tb4b4b4(Te6edf3posTb4b4b4, Te6edf3dataTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3pos Tff7b72+= T79c0ff4Tb4b4b4;
Tb4b4b4}Tb4b4b4;

Tff7b72const Te6edf3writeString Tff7b72= Tb4b4b4(Te6edf3stringTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3stringTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3viewTb4b4b4.Te6edf3setUint8Tb4b4b4(Te6edf3pos Tff7b72+ Te6edf3iTb4b4b4, Te6edf3stringTb4b4b4.Te6edf3charCodeAtTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3pos Tff7b72+= Te6edf3stringTb4b4b4.Te6edf3lengthTb4b4b4;
Tb4b4b4}Tb4b4b4;

Te6edf3writeStringTb4b4b4(Ta5d6ff"RIFF"Tb4b4b4)Tb4b4b4;
Te6edf3setUint32Tb4b4b4(Te6edf3length Tff7b72- T79c0ff8Tb4b4b4)Tb4b4b4;
Te6edf3writeStringTb4b4b4(Ta5d6ff"WAVE"Tb4b4b4)Tb4b4b4;
Te6edf3writeStringTb4b4b4(Ta5d6ff"fmt "Tb4b4b4)Tb4b4b4;
Te6edf3setUint32Tb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Te6edf3setUint16Tb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3setUint16Tb4b4b4(Te6edf3numOfChanTb4b4b4)Tb4b4b4;
Te6edf3setUint32Tb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3sampleRateTb4b4b4)Tb4b4b4;
Te6edf3setUint32Tb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3sampleRate Tff7b72* T79c0ff2 Tff7b72* Te6edf3numOfChanTb4b4b4)Tb4b4b4;
Te6edf3setUint16Tb4b4b4(Te6edf3numOfChan Tff7b72* T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3setUint16Tb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Te6edf3writeStringTb4b4b4(Ta5d6ff"data"Tb4b4b4)Tb4b4b4;
Te6edf3setUint32Tb4b4b4(Te6edf3length Tff7b72- Te6edf3pos Tff7b72- T79c0ff4Tb4b4b4)Tb4b4b4;

Tff7b72for Tb4b4b4(Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3bufferTb4b4b4.Te6edf3numberOfChannelsTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Te6edf3channelsTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3getChannelDataTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4)Tb4b4b4;

Tff7b72while Tb4b4b4(Te6edf3pos Tff7b72< Te6edf3lengthTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3numOfChanTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3sample Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(Tff7b72-T79c0ff1Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3minTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3channelsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[Te6edf3offsetTb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3sample Tff7b72= Tb4b4b4(Te6edf3sample Tff7b72< T79c0ff0 Tff7b72? Te6edf3sample Tff7b72* T79c0ff0x8000 Tff7b72: Te6edf3sample Tff7b72* T79c0ff0x7fffTb4b4b4) Tff7b72| T79c0ff0Tb4b4b4;
Te6edf3viewTb4b4b4.Te6edf3setInt16Tb4b4b4(Te6edf3posTb4b4b4, Te6edf3sampleTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3pos Tff7b72+= T79c0ff2Tb4b4b4;
Tb4b4b4}
Te6edf3offsetTff7b72++Tb4b4b4;
Tb4b4b4}

Tff7b72return Tff7b72new Te6edf3BlobTb4b4b4(Tb4b4b4[Te6edf3buffer_arrTb4b4b4]Tb4b4b4, Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"audio/wav" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>

Tb4b4b4<Tff7b72style Te6edf3scopedTb4b4b4>
Tff7b72canvas Tb4b4b4{
Tff7b72image-renderingTb4b4b4: Tff7b72pixelatedTb4b4b4;
Tb4b4b4}
Tb4b4b4<Tb4b4b4/Tff7b72styleTb4b4b4>


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────